12. 向量存储
向量内存存储
之前提过,向量不是 C++ 中最高效的变量。其中一个原因是,声明向量变量时,不需要指定向量长度。因此,编译器不会提前知道需要分配多少内存。一旦向量长度超出了初始分配内存,整个向量就会被复制到空间更大的新 RAM 位置。
如果向vector容器插入值之前即可指定向量的长度,向量会更高效。这可以通过 reverse() 方法实现。该方法能保证向量可以存储预留的元素数。
举例
下面是一个 reserve() 方法的例子:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> myvector;
int vector_size = 50;
myvector.reserve(vector_size);
for (int i = 0; i < vector_size; i++) {
myvector.push_back(i);
}
return 0;
}
在 C++ 中,有多种方式可以初始化一个二维向量。优化你的程序时,你需要测试不同的初始化方式,确定哪种方式对你的程序效果最好。
要保证速度最快,需要考虑向量长度和类型。
练习
在接下来的练习中,你会看到三个不同的函数,分别在三个文件中:
- zeros.cpp
- unreserved.cpp
- initializer.cpp
你的任务是修改 reserved.cpp 中的代码,保证在使用 push_back 方法前预定二维向量变量和一维向量变量的大小。你会看到,修改后代码速度有无提升。
unreserved() 函数会使用一个 for 循环来初始化一个二维向量。initializer() 函数使用标准库方法初始化向量。reserved.cpp 中的代码和 unreserved.cpp 中的代码完全一样。你的任务是使用 reserve() 方法来修改 reserved.cpp 文件。